package huawei.od;

import java.util.*;

/**
 * 【选修课】
 * 需要找出同时选修了两门选修课的学生，先按照班级进行划分，班级编号小的先输出
 * 每个班级按照两门选修课成绩和的降序排序，成绩相同时按照学生的学号升序排序
 * 「输入描述」
 * 第一行：第一门选修课学生的成绩
 * 第二行：第二门选修课学生的成绩
 * -每行数据中学生之间以英文分号分隔
 * -每个学生的学号和成绩以英文逗号分隔
 * -学生学号的格式为8位数字（2位院系编号+入学年份后2位+院系内部1位专业编号+所在班级3位学号）
 * -学生成绩的取值范围为[0,100]之间的整数
 * -两门选修课选修学生数的取值范围为[1-2000]之间的整数
 * 「输出描述」
 * 同时选修了两门选修课的学生的学号
 * -如果没有同时选修两门的学生，输出NULL
 * -否则先按照班级划分，班级编号小的先输出，每个班级先输出班级编号（学号前五位）
 * -然后另起一行输出这个班级同时选修两门选修课的学生学号
 * -学号按照要求排序（按照两门选修课成绩和的降序，成绩和相同时按照学号升序）
 * -学生之间以英文分号分隔
 *
 * 示例：
 * 输入：
 * 01202021,75;01201033,95;01202008,80;01203006,90;01203088,100
 * 01202008,70;01203088,85;01202111,80;01202021,75;01201100,88
 * 输出：
 * 01202
 * 01202008,01202021
 * 01203
 * 01203088
 *
 * 输入：
 * 01201022,75;01202033,95;01202018,80;01203006,90;01202066,100
 * 01202008,70;01203102,85;01202111,80;01201021,75;01201100,88
 * 输出：
 * NULL
 *
 * @author syzsn
 */
public class ElectiveCourses {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String gradeOne = in.nextLine();
        String gradeTwo = in.nextLine();

        Map<String, Integer> studentIdMap = new HashMap<>();
        StringTokenizer st = new StringTokenizer(gradeTwo, ";");
        while (st.hasMoreTokens()){
            List<String> studengIds = new ArrayList<>();
            StringTokenizer st2 = new StringTokenizer(st.nextToken(), ",");
            while (st2.hasMoreTokens()){
                studengIds.add(st2.nextToken());
            }
            studentIdMap.put(studengIds.get(0), Integer.parseInt(studengIds.get(1)));
        }

        Map<String, Set<Student>> studentMap = new HashMap<>();
        st = new StringTokenizer(gradeOne, ";");
        while (st.hasMoreTokens()){
            List<String> studengIds = new ArrayList<>();
            StringTokenizer st2 = new StringTokenizer(st.nextToken(), ",");
            while (st2.hasMoreTokens()){
                studengIds.add(st2.nextToken());
            }
            String id = studengIds.get(0);
            if(studentIdMap.containsKey(id)){
                int totalScore = Integer.parseInt(studengIds.get(1)) + studentIdMap.get(id);
                String temp = id.substring(0,5);
                studentMap.computeIfAbsent(temp, k-> new TreeSet<>()).add(new Student(id, totalScore));
            }
        }

        if(studentMap.isEmpty()){
            System.out.println("NULL");
        }else{
            for(Map.Entry<String, Set<Student>> entry : studentMap.entrySet()){
                System.out.println(entry.getKey());
                StringBuilder res = new StringBuilder();
                for(Student student : entry.getValue()){
                    res.append(student.id).append(";");
                }
                System.out.println(res.substring(0, res.length()-1));
            }
        }
        return;
    }

    public static class Student implements Comparable<Student>{
        String id;
        int score;

        public Student(String id, int score) {
            this.id = id;
            this.score = score;
        }

        @Override
        public int compareTo(Student other) {
            return score != other.score ? Integer.compare(other.score, score) : id.compareTo(other.id);
        }
    }
}
